'Description: Reading / Writing any Registry Key

'Module Declarations ---------------------------------------------------------------------------

Public Const READ_CONTROL = &H20000
Public Const STANDARD_RIGHTS_READ = (READ_CONTROL)
Public Const STANDARD_RIGHTS_WRITE = (READ_CONTROL)
Public Const KEY_QUERY_VALUE = &H1
Public Const KEY_SET_VALUE = &H2
Public Const KEY_CREATE_SUB_KEY = &H4
Public Const KEY_ENUMERATE_SUB_KEYS = &H8
Public Const KEY_NOTIFY = &H10
Public Const KEY_CREATE_LINK = &H20
Public Const SYNCHRONIZE = &H100000
Public Const STANDARD_RIGHTS_ALL = &H1F0000
Public Const KEY_READ = ((STANDARD_RIGHTS_READ Or _
   KEY_QUERY_VALUE Or KEY_ENUMERATE_SUB_KEYS Or KEY_NOTIFY) _
   And (Not SYNCHRONIZE))
Public Const KEY_WRITE = ((STANDARD_RIGHTS_WRITE Or _
   KEY_SET_VALUE Or KEY_CREATE_SUB_KEY) And (Not SYNCHRONIZE))
Public Const KEY_ALL_ACCESS = ((STANDARD_RIGHTS_ALL Or _
   KEY_QUERY_VALUE Or KEY_SET_VALUE Or KEY_CREATE_SUB_KEY _
   Or KEY_ENUMERATE_SUB_KEYS Or KEY_NOTIFY Or KEY_CREATE_LINK) _
   And (Not SYNCHRONIZE))
Public Const KEY_EXECUTE = ((KEY_READ) And (Not SYNCHRONIZE))

Public Const ERROR_SUCCESS = 0&

Declare Function RegOpenKeyEx Lib "advapi32.dll" _
   Alias "RegOpenKeyExA" (ByVal hKey As Long, _
   ByVal lpSubKey As String, ByVal ulOptions As Long, _
   ByVal samDesired As Long, phkResult As Long) As Long
Declare Function RegQueryValueEx Lib "advapi32.dll" _
   Alias "RegQueryValueExA" (ByVal hKey As Long, _
   ByVal lpValueName As String, ByVal lpReserved As Long, _
   lpType As Long, lpData As Any, lpcbData As Long) As Long
Declare Function RegCloseKey Lib "advapi32.dll" _
   (ByVal hKey As Long) As Long




'Module Function-------------------------------------------------------------------------------

'Function sdaGetRegEntry(strKey As String, _
   strSubKeys As String, strValName As String, _
   lngType As Long) As String
'* Demonstration of win32 API's to query
'  the system registry
'  Stu Alderman -- 2/30/96

On Error GoTo sdaGetRegEntry_Err

  Dim lngResult As Long, lngKey As Long
  Dim lngHandle As Long, lngcbData As Long
  Dim strRet As String

  Select Case strKey
    Case "HKEY_CLASSES_ROOT": lngKey = &H80000000
    Case "HKEY_CURRENT_CONFIG": lngKey = &H80000005
    Case "HKEY_CURRENT_USER": lngKey = &H80000001
    Case "HKEY_DYN_DATA": lngKey = &H80000006
    Case "HKEY_LOCAL_MACHINE": lngKey = &H80000002
    Case "HKEY_PERFORMANCE_DATA": lngKey = &H80000004
    Case "HKEY_USERS": lngKey = &H80000003
    Case Else: Exit Function
  End Select
    
  If Not ERROR_SUCCESS = RegOpenKeyEx(lngKey, _
     strSubKeys, 0&, KEY_READ, _
     lngHandle) Then Exit Function
  
  lngResult = RegQueryValueEx(lngHandle, strValName, _
     0&, lngType, ByVal strRet, lngcbData)
  strRet = Space(lngcbData)
  lngResult = RegQueryValueEx(lngHandle, strValName, _
     0&, lngType, ByVal strRet, lngcbData)
  
  If Not ERROR_SUCCESS = RegCloseKey(lngHandle) Then _
     lngType = -1&
    
  sdaGetRegEntry = strRet
  
sdaGetRegEntry_Exit:
  On Error GoTo 0
  Exit Function

sdaGetRegEntry_Err:
  lngType = -1&
  MsgBox Err & ">  " & Error$, 16, _
     "GenUtils/sdaGetRegEntry"
  Resume sdaGetRegEntry_Exit

'End Function





'Sample Use. Place the following code in under a command button or in a menu, etc...

  Dim lngType As Long, varRetString As Variant
  Dim lngI As Long, intChar As Integer

  varRetString = sdaGetRegEntry(cboStartKey, _
   txtRegistrationPath, txtRegistrationParameter, _
   lngType)
  
  txtResult = varRetString
  txtDataType = lngType
  txtDataLength = Len(varRetString)
    
  txtHex = ""
  If Len(varRetString) Then
    For lngI = 1 To Len(varRetString)
      intChar = Asc(Mid(varRetString, lngI, 1))
      If intChar > 15 Then
        txtHex = txtHex & Hex(intChar) & " "
      Else
        txtHex = txtHex & "0" & Hex(intChar) & " "
      End If
    Next lngI
  End If